import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'

// 1. 创建了一个axios实例
const http = axios.create({
  // 一个项目从 开发 - 测试 - 上线, 对应的接口服务器地址可能会发生变化
  // 手动切换 => 麻烦 => 自定切换 => 环境变量
  // process.env 获取当前的环境变量
  baseURL: process.env.VUE_APP_BASE_API, // 使用了环境变量
  timeout: 5000 // 配置请求超时事件
})

// 2. 配置了一个请求拦截器
// 在请求发出去之前, 做一些公共的配置 比如: 请求头携带token...
http.interceptors.request.use(config => {
  // 2.1 在请求发送出去之前, 判断有没有token, 有则携带
  const token = store.getters.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

// 3. 配置了一个响应拦截器
// 在响应数据到达请求回调函数之前, 做一些统一的处理, 比如: 统一处理返回的数据...
http.interceptors.response.use(response => {
  const res = response.data
  // 3.1 判断(响应成功但操作失败的情况)
  if (res.success === false) {
    // 统一提示用户
    Message.error(res.message)
    // 返回失败的结果
    return Promise.reject(new Error(res.message))
  }
  // 3.2 正常情况
  return res
}, error => {
  // 服务器404, 500.. (不可控), 会统一走此回调函数
  // 以目录形式打印error
  // console.dir(error, '----66666-----')

  // token过期要退出登录 注意: error.response.data.code 多一个data
  if (error.response.status === 401 && error.response.data.code === 10002) {
    // 1. 提示用户
    Message.error('您当前的登录已过期, 请重新登录~')
    // 2. 退出登录数据处理
    store.dispatch('user/logout')
    // 3. 跳转回登录页
    router.push('/login')
  } else {
    // 统一提示用户
    Message.error(error.message)
  }
  return Promise.reject(error)
})

export default http

// 之前项目中使用axios的方式
// axios.defaults.baseURL = 'https://www.jd.com'
// axios({
//   method: 'get',
//   url: '/api/list',
//   params: {
//     name: 'zs',
//     age: 18
//   }
// })

// axios({
//   method: 'post',
//   url: '/api/login',
//   data: {
//     name: 'zs',
//     age: 18
//   }
// })

// 注意: 上面发起网络请求的方式是有局限性的
// 假设我们项目中要请求多个不同接口服务器上的数据, 这个时候要配置多个全局baseURL就比较麻烦
// 如何解决? axios.create() ---> 本质上就是new Axios()创建一个新的实例对象
// const http1 = axios.create({
//   baseURL: 'https://www.jd.com'
// })
// http1({
//   method: 'get',
//   url: '/api/list',
//   params: {
//     name: 'zs',
//     age: 18
//   }
// })

// const http2 = axios.create({
//   baseURL: 'https://www.baidu.com'
// })
// http2({
//   method: 'post',
//   url: '/api/login',
//   data: {
//     name: 'zs',
//     age: 18
//   }
// })
